/*******************************************************************************
  * @file                   USART.c
  * @Author:                MQjehovah                 mail:MQjehovah@hotmail.com
  * @version                1.0.0
  * @date                   2017.8.24
  * @brief                  
  ******************************************************************************
  * @attention
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "usart.h"
/* Definition ----------------------------------------------------------------*/

/* Functions -----------------------------------------------------------------*/
/*******************************************************************************
  * @brief  串口发送一个字节              
  * @param  None              
  * @retval None              
  * @Note   None              
*******************************************************************************/
void usart_send_char(USART_TypeDef *USARTx, char c)
{
	USART_SendData(USARTx, c);
	while (RESET == USART_GetFlagStatus(USARTx, USART_FLAG_TXE))
		;
}
/*******************************************************************************
  * @brief  USART发送字符串
  * @param  None
  * @retval None
  * @Note   None
*******************************************************************************/
void usart_send_str(USART_TypeDef *USARTx, char *senddata)
{
	while ('\0' != *senddata) // \0 表示字符串结束标志，通过检测是否字符串末尾
	{
		USART_SendData(USARTx, *senddata++);
		while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET)
			;
	}
}

/*******************************************************************************
  * @brief  打印数字，带进制转换
  * @param  None
  * @retval None
  * @Note   None
*******************************************************************************/
void usart_send_number(USART_TypeDef *USARTx, unsigned long n, u8 base)
{
	unsigned char buf[8 * sizeof(long)]; // Assumes 8-bit chars.
	unsigned long i = 0;

	if (n == 0)
	{
		usart_send_char(USARTx, '0');
		return;
	}

	while (n > 0)
	{
		buf[i++] = n % base;
		n /= base;
	}

	for (; i > 0; i--)
		usart_send_char(USARTx, (char)(buf[i - 1] < 10 ? '0' + buf[i - 1] : 'A' + buf[i - 1] - 10));
}

//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
	int handle;
};

FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
	x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
	USART_SendData(USART_DEBUG, ch);
	while (RESET == USART_GetFlagStatus(USART_DEBUG, USART_FLAG_TXE))
		;
	return ch;
}
#endif

#ifdef DEBUG
/*******************************************************************************
  * @brief  初始化串口1，用于printf输出             
  * @param  bound:波特率              
  * @retval None              
  * @Note   None              
*******************************************************************************/
void usart_debug_init(u32 bound)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);  //使能GPIOB时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //使能USART1时钟
	//串口1对应引脚复用映射
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_USART1); //GPIOB9复用为USART1
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_USART1); //GPIOB10复用为USART1
	//USART1端口配置
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;   //上拉
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	//485收发使能端口
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;	  //普通输出模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;	 //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;	   //上拉
	GPIO_Init(GPIOB, &GPIO_InitStructure);			   //初始化
	//USART1 初始化设置
	USART_InitStructure.USART_BaudRate = bound;										//波特率设置
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;						//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;							//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;								//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;					//收发模式
	USART_Init(USART1, &USART_InitStructure);										//初始化串口3
	USART_Cmd(USART1, ENABLE);														//使能串口3
	USART_ClearFlag(USART1, USART_FLAG_TC);
}

/*******************************************************************************
  * @brief  串口发送1个字符              
  * @param  USARTx:串口端口   c:要发送的字符           
  * @retval None              
  * @Note   None              
*******************************************************************************/
void debug_send_char(u8 c)
{
	USART_TX_EN;
	simple_delay_us(100);
	usart_send_char(USART_DEBUG, c);
	simple_delay_us(100);
	USART_RX_EN;
}

/*******************************************************************************
  * @brief  串口发送字符串           
  * @param  USARTx:串口端口   str:要发送的字符串           
  * @retval None              
  * @Note   None              
*******************************************************************************/
void debug_send_str(char *str)
{
	USART_TX_EN;
	simple_delay_us(100);
	usart_send_str(USART_DEBUG, str);
	simple_delay_us(100);
	USART_RX_EN;
}
#endif
/*********************************END OF FILE**********************************/
